/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-4-23 下午10:15 Created by dwzhang
 */
package com.jade.framework.base.criterion.sql;

import com.jade.framework.base.criterion.Constants;
import com.jade.framework.base.criterion.CriterionInterpreter;
import com.jade.framework.base.criterion.expression.InExpression;

/**
 * InExpression解析器。
 *
 * @author dwzhang
 * @version 1.0 13-4-23 下午10:15
 */
public class InInterpreter implements CriterionInterpreter<SqlContext, InExpression>
{
    private boolean not;

    public InInterpreter()
    {
        this(false);
    }

    public InInterpreter(boolean not)
    {
        this.not = not;
    }

    /**
     * 对表达式进行解析，形成可以用于实际查询的上下文。
     *
     * @param context    解析上下文。
     * @param expression IN表达式。
     */
    public void interprete(SqlContext context, InExpression expression)
    {
        context.append(expression.getFullName());
        context.append(Constants.BLANK);
        if (not) {
            context.append(Constants.NOT + " ");
        }
        context.append(Constants.IN);
        context.append(Constants.LEFT_PARENTHESIS);
        Object[] objs = expression.getValues();
        for (int i = 0; i < objs.length; i++) {
            if (i > 0) {
                context.append(Constants.COMMA);
                context.append(Constants.BLANK);
            }
            context.append(Constants.INTERROGATION_POINT);
            context.addPrepraredValue(objs[i]);
        }
        context.append(Constants.RIGHT_PARENTHESIS);
    }
}
